package com.yc.mybatis;

import com.yc.common.util.DBHelper;
import com.yc.favorite.mapper.TagMapper;
import com.yc.favorite.po.Tag;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.SqlSessionFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SqlSession {

    static {
        DBHelper.init("jdbc:mysql://127.0.0.1/c94-s3-ply-favorite",
                "root", "a", "com.mysql.jdbc.Driver");
    }

    public static void main(String[] args) {
        SqlSession session = new SqlSession();
        TagMapper tm = session.getMapper(TagMapper.class);

        for (Tag t : tm.selectAll()) {
            System.out.println(t);
        }

        tm.selectByTanme("name");

    }


    public <T> T getMapper(Class<T> cls) {
        return (T) Proxy.newProxyInstance(
                cls.getClassLoader(),
                new Class[]{cls},
                (proxy, method, args) -> {
                    Select s = method.getAnnotation(Select.class);
                    if (s != null) {
                        String sql = s.value()[0];
                        Class<?> retCls = method.getReturnType();
                        // 判断 retCls 是否是 List 的子类
                        // List  实体类
                        if (List.class.isAssignableFrom(retCls)) {
                            // 动态获取泛型信息
                            // System.out.println(retCls.);
                            // 假设获取到了实体对象类名
                            // Class<?> entityCls = Tag.class;
                            // List<Tag> retList = new ArrayList<>();
                            List<Tag> retList = DBHelper.selectListBean(sql, Tag.class);
                            return retList;
                        } else {
                            System.out.println(retCls);
                            // DBHelper.selectOneBean()
                            // 参数数组 ==> #{参数}
                            System.out.println(method.getParameters()[0].getName());
                            // @Param
                            /**
                             * 作业: 完成 selectByTanme 单个参数查询
                             */
                        }
                    } else {
                        // Insert i = method.getAnnotation(Insert.class);
                        // ... 自行扩展
                    }
                    return null;
                }
        );
    }

}
